Emulate reborrowing for user types.
A generalized reference is a type that has reference semantics, without actually being
a native Rust reference (like &T
and &mut T
). e.g.:
Given a &'a
[mut] reference of a &'b
view over some owned object,
reborrowing it means getting an active &'a
view over the owned object,
which renders the original reference inactive until it's dropped, at which point
the original reference becomes active again.
This crate defines traits to make generalized references more ergonomic to use by giving the ability to borrow and reborrow them.
Features
derive
: This imports a derive macro helper for implementing reborrow for user
types. It can be used with a Ref/RefMut
pair of structs/tuple structs with
the same member names, one containing shared references and the other mutable
references. The shared variant must be Copy
, and the macro is used on the
mutable variant and generates the relevant traits for both types.
Examples
This fails to compile since we can't use a non-Copy
value after it's moved.
let mut x = 0;
let o = Some;
takes_mut_option; // `o` is moved here,
takes_mut_option; // so it can't be used here.
This can be worked around by unwrapping the option, reborrowing it, and then wrapping it again.
let mut x = 0;
let mut o = Some;
takes_mut_option; // "Reborrowing" the `Option`
takes_mut_option; // allows us to use it later on.
drop; // can still be used here
Using this crate, this can be shortened to
use ReborrowMut;
let mut x = 0;
let mut o = Some;
takes_mut_option; // "Reborrowing" the `Option`
takes_mut_option; // allows us to use it later on.
drop; // can still be used here
The derive macro can be used with structs or tuple structs, and generates
the trait definitions for Reborrow
and ReborrowMut
.
use ;
;
;